package main

import "fmt"

//定义空接口
type Element interface {

}

type Person struct {
	name string
	age int
}

func main() {
	//list := make([]Element, 3)
	list := make([]interface{}, 3)
	list[0] = 1
	list[1] = "Hello"
	list[2] = Person{"mike", 18}

	/*
		类型查询
		可以直接判断是否是该类型的变量：
		value, ok = element.(T)，value 就是变量的值，ok 是一个 bool 类型，element 是 interface 变量，T 是断言的类型
		如果 element 里面确实存储了 T 类型的数值，那么 ok 返回 true，否则返回 false。
	 */

	for index, data := range list {
		//第一个返回的是值,第二个返回的是判断结果的真假
		if value,ok := data.(int); ok {
			fmt.Printf("list[%d] is an int and its value is %d\n", index, value)
		} else if value,ok := data.(string); ok {
			fmt.Printf("list[%d] is a string and its value is %s\n", index, value)
		} else if value,ok := data.(Person); ok {
			fmt.Printf("list[%d] is a Person and ite value is [%s, %d]", index, value.name, value.age)
		}
	}
}
